home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 4 / Apprentice-Release4.iso / Source Code / Libraries / C Internet Config / IC Component Source ƒ / 68k Version ƒ / IC Component.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-12-06  |  18.5 KB  |  715 lines  |  [TEXT/SPM ]

  1. /*
  2.     ICComponent.c
  3.     
  4.     C version of the IC Component.
  5.     
  6.     One may wonder why I took the time to port the IC stuff to C.  The simple answer is that I wanted to be able
  7.     to extend IC to handle some Internet services that I am bringing online.  Since I don't have a pascal compiler
  8.     (and since I prefer C), I first had to port IC before I could begin extending it.
  9.     
  10.     The original comment for the pascal file follows...
  11.     
  12.     History:
  13.         11/06/95 - dhn - Began C port.
  14.         
  15. */
  16.  
  17. /* Original Comment:
  18.     (* File:         ICComponent.p
  19.      * Generated by: 1.0d4
  20.      * For:          IC 1.2
  21.      * On:           Monday, 25 September 1995, 19:28:12
  22.      * 
  23.      * This file is part of the Internet Configuration system and
  24.      * is placed in the public domain for the benefit of all.
  25.      *)
  26. */
  27.  
  28. #include <Components.h>
  29. #include <Types.h>
  30. #include <Files.h>
  31. #include <Memory.h>
  32. #include <Errors.h>
  33. #include <ToolUtils.h>
  34. #include <AppleTalk.h>
  35. #include <Aliases.h>
  36.  
  37. #if USESROUTINEDESCRIPTORS
  38. #include <stdlib.h>
  39. #endif
  40.  
  41. #include "IC Types.h"
  42. #include "IC Keys.h"
  43. #include "IC Link In Subs.h"
  44. #include "IC Resource API.h"
  45. #include "IC Component API.h"
  46. #include "IC Component Selectors.h"
  47.  
  48. #include "IC Component.h"
  49.  
  50. ICError GetStringFromResourceFile(GlobalsHandle globals,short id,StringPtr name){
  51.     ICError err;
  52.     short refnum;
  53.     StringHandle strh;
  54.     
  55.     err=(ICError)noErr;
  56.     name[0]=0;
  57.     
  58. #ifndef DEBUG_IC_COMPONENT
  59.     /*
  60.         When debugging the IC component, the res file is not registered with the Component
  61.         Manager.  However, we don't want this to disable our debugging.
  62.         
  63.         Simple solution: Add the resource to the project file and conditionally compile the open
  64.         and close resource file stuff.
  65.     */
  66.     refnum=OpenComponentResFile((Component)(*globals)->self);
  67.  
  68.     if (refnum<=0){
  69.         return resNotFound;
  70.     }
  71. #endif
  72.     
  73.     strh=GetString(id);
  74.     if (strh==(StringHandle)0){
  75.         err=resNotFound;
  76.     } else {
  77.         HLock((Handle)strh);
  78.         BlockMoveData((Ptr)*strh,(Ptr)name,(*strh)[0]+1);
  79.         HUnlock((Handle)strh);
  80.         
  81.         err=noErr;
  82.     }
  83.     
  84. #ifndef DEBUG_IC_COMPONENT
  85.     CloseComponentResFile(refnum);
  86. #endif
  87.     
  88.     return err;
  89. }
  90.  
  91. // Component Manager Routines
  92. pascal ComponentResult ICCICanDo(GlobalsHandle globals,short selector){
  93.     ComponentResult cr=(ComponentResult)0;
  94.     
  95.     if ((selector>=kComponentVersionSelect)&&(selector<=kComponentOpenSelect)){
  96.         cr=(ComponentResult)1;
  97.     } else {
  98.         if ((selector>=kICC_first_select)&&(selector<=kICC_last_select)){
  99.             cr=(ComponentResult)1;
  100.         }
  101.     }
  102.     
  103.     if (!cr)
  104.         SysBeep(3);
  105.     
  106.     return cr;
  107. }
  108.  
  109. pascal ComponentResult ICCIOpen(GlobalsHandle globals,ComponentInstance self){
  110.     ComponentResult err;
  111.     
  112.     globals=(GlobalsHandle)NewHandle(sizeof(GlobalsRecord));
  113.     if (globals==(GlobalsHandle)0){
  114.         err=MemError();
  115.     } else {
  116.         (*globals)->self=self;
  117.         (*globals)->current_target=self;
  118.         
  119.         SetComponentInstanceStorage(self,(Handle)globals);
  120.         err=(ComponentResult)noErr;
  121.     }
  122.     
  123.     return err;
  124. }
  125.  
  126. pascal ComponentResult ICCIClose(GlobalsHandle globals,ComponentInstance self){
  127.     ComponentResult err=(ComponentResult)noErr;
  128.     
  129.     if (globals!=(GlobalsHandle)0){
  130.         DisposeHandle((Handle)globals);
  131.     }
  132.     
  133.     return err;
  134. }
  135.  
  136. pascal ComponentResult ICCITarget(GlobalsHandle globals,ComponentInstance new_target){
  137.     ComponentResult err=(ComponentResult)noErr;
  138.     
  139.     if (globals!=(GlobalsHandle)0){
  140.         (*globals)->current_target=new_target;
  141.     } else {
  142.         err=(ComponentResult)paramErr;
  143.     }
  144.     
  145.     return err;
  146. }
  147.  
  148. // Internet Configuration specific routines
  149.  
  150. pascal ICError ICCIStart(GlobalsHandle globals,OSType creator){
  151.     OSErr err;
  152.     
  153.     err=ICRStart(&((*globals)->inst),creator);
  154.     
  155.     if (err==noErr){
  156.         err=ICCDefaultFileName((*globals)->current_target,(*globals)->inst.default_filename);
  157.     }
  158.     
  159.     if (err==noErr){
  160.         err=GetStringFromResourceFile(globals,kICdefault_prompt_ID,(*globals)->inst.prompt);
  161.     }
  162.     
  163.     return (ICError)err;
  164. }
  165.  
  166. pascal ICError ICCIForceInside(GlobalsHandle globals,ICPerm perm,Boolean* force_info){
  167.     ICError err;
  168.     ICPerm current_perm;
  169.     
  170.     *force_info=false;
  171.     current_perm=(*globals)->inst.perm;
  172.     
  173.     if ((current_perm==perm)||((current_perm==icReadWritePerm)&&(perm==icReadOnlyPerm))){
  174.         err=(ICError)noErr;
  175.     } else if (current_perm==icNoPerm){
  176.         err=ICCBegin((*globals)->current_target,perm);
  177.         *force_info=(err==(ICError)noErr);
  178.     } else {
  179.         err=(ICError)icPermErr;
  180.     }
  181.     
  182.     return err;
  183. }
  184.  
  185. pascal ICError ICCIReleaseInside(GlobalsHandle globals,Boolean force_info){
  186.     if (force_info)
  187.         return ICCEnd((*globals)->current_target);
  188.     
  189.     return (ICError)noErr;
  190. }
  191.  
  192. /*
  193.     The set and get routines are significantly complicated by the fact that the ICR versions can call
  194.     ICBegin if the calling program hasn't done so already. The problem with this is that override
  195.     component would not see these calls because the ICR code calls the code directly. The solution
  196.     is for the component to calls these routines itself (which sends them through the override
  197.     components. Oh god, this is confusing and it's getting worse as I try to maintain compatibility
  198.     and putting the cache in is going to be even worse.
  199. */
  200. pascal ICError ICCIGetPref(GlobalsHandle globals,StringPtr key,ICAttr* attr,Ptr buf,long* size){
  201.     ICError err,err2;
  202.     Boolean force_info;
  203.     
  204.     err=ICCIForceInside(globals,icReadOnlyPerm,&force_info);
  205.     
  206.     if (err==noErr){
  207.         err=ICRGetPref(&((*globals)->inst),key,attr,buf,size);
  208.     }
  209.     
  210.     err2=ICCIReleaseInside(globals,force_info);
  211.     
  212.     if (err==noErr)
  213.         err=err2;
  214.     
  215.     return err;
  216. }
  217.  
  218. pascal ICError ICCISetPref(GlobalsHandle globals,StringPtr key,ICAttr attr,Ptr buf,long size){
  219.     ICError err,err2;
  220.     Boolean force_info;
  221.     
  222.     err=ICCIForceInside(globals,icReadWritePerm,&force_info);
  223.     if (err==noErr)
  224.         err=ICRSetPref(&((*globals)->inst),key,attr,buf,size);
  225.     
  226.     err2=ICCIReleaseInside(globals,force_info);
  227.     
  228.     if (err==noErr)
  229.         err=err2;
  230.     
  231.     return err;
  232. }
  233.  
  234. pascal ICError ICCIFindPrefHandle(GlobalsHandle globals,StringPtr key,ICAttr* attr,Handle prefh){
  235.     ICError err,err2;
  236.     long prefsize;
  237.     Boolean force_info;
  238.     
  239.     err=noErr;
  240.     if (prefh==(Handle)0)
  241.         err=paramErr;
  242.     
  243.     prefsize=0L;
  244.     
  245.     if (err==noErr){
  246.         err=ICCIForceInside(globals,icReadOnlyPerm,&force_info);
  247.         if (err==noErr)
  248.             err=ICCGetPref((*globals)->current_target,key,attr,nil,&prefsize);
  249.         
  250.         if (err==noErr){
  251.             SetHandleSize(prefh,prefsize);
  252.             err=MemError();
  253.         }
  254.         
  255.         if (err==noErr){
  256.             HLock(prefh);
  257.             err=ICCGetPref((*globals)->current_target,key,attr,*prefh,&prefsize);
  258.             HUnlock(prefh);
  259.         }
  260.         
  261.         err2=ICCIReleaseInside(globals,force_info);
  262.         
  263.         if (err==noErr)
  264.             err=err2;
  265.     }
  266.     
  267.     if ((prefh!=(Handle)0)&&(err!=noErr)){
  268.         SetHandleSize(prefh,0);
  269.     }
  270.     
  271.     return err;
  272. }
  273.  
  274. pascal ICError ICCIGetPrefHandle(GlobalsHandle globals,StringPtr key,ICAttr* attr,Handle* prefh){
  275.     ICError err;
  276.     
  277.     *prefh=NewHandle(0);
  278.     if (*prefh==(Handle)0)
  279.         return MemError();
  280.     
  281.     err=ICCIFindPrefHandle(globals,key,attr,*prefh);
  282.     
  283.     if (err==icPrefNotFoundErr){
  284.         SetHandleSize(*prefh,0);
  285.         *attr=(ICAttr)0;
  286.         err=noErr;
  287.     }
  288.     
  289.     return err;
  290. }
  291.  
  292. pascal ICError ICCISetPrefHandle(GlobalsHandle globals,StringPtr key,ICAttr attr,Handle prefh){
  293.     SignedByte s;
  294.     ICError err=noErr;
  295.     
  296.     if (prefh!=(Handle)0){
  297.         if (*prefh==(Ptr)0)
  298.             err=paramErr;
  299.         if (err==noErr){
  300.             s=HGetState(prefh);
  301.             HLock(prefh);
  302.             err=ICCSetPref((*globals)->current_target,key,attr,*prefh,GetHandleSize(prefh));
  303.             HSetState(prefh,s);
  304.         }
  305.     } else {
  306.         err=ICCSetPref((*globals)->current_target,key,attr,(Ptr)0,0);
  307.     }
  308.     
  309.     return err;
  310. }
  311.  
  312. pascal ICError ICCIDefaultFileName(GlobalsHandle globals,StringPtr name){
  313.     ICError err;
  314.     short refnum;
  315.     StringHandle strh;
  316.     Str255 s;
  317.     
  318.     err=GetStringFromResourceFile(globals,kICdefault_file_name_ID,s);
  319.     
  320.     if (err!=noErr)
  321.         PasStrCopy(kICDefaultFileName,name);
  322.     else
  323.         PasStrCopy(s,name);
  324.     
  325.     return err;
  326. }
  327.  
  328. pascal ICError ICCILaunchURL(GlobalsHandle globals,StringPtr hint,Ptr data,long len,long* selStart,long* selEnd){
  329.     ICError err;
  330.     Handle urlh;
  331.     ICAppSpec helper;
  332.     Str255 scheme;
  333.     long junk_attr;
  334.     long size;
  335.     
  336.     urlh=NewHandle(0);
  337.     if (urlh==(Handle)0){
  338.         return MemError();
  339.     }
  340.     
  341.     err=ICCParseURL((*globals)->current_target,hint,data,len,selStart,selEnd,urlh);
  342.     
  343.     if (err==noErr){
  344.         err=FindScheme(urlh,scheme);
  345.     }
  346.     
  347.     if (err==noErr){
  348.         Str255 conscheme;
  349.         Ptr spos;
  350.         
  351.         PasStrCopy(kICHelper,conscheme);
  352.         spos=(Ptr)(&(conscheme[conscheme[0]+1]));
  353.         
  354.         BlockMoveData((Ptr)(&(scheme[1])),spos,scheme[0]);
  355.         conscheme[0]+=scheme[0];
  356.         
  357.         size=sizeof(helper);
  358.         err=ICCGetPref((*globals)->current_target,conscheme,&junk_attr,(Ptr)(&helper),&size);
  359.     }
  360.     
  361.     if (err==noErr){
  362.         err=LaunchURL(helper.fCreator,urlh);
  363.     }
  364.     
  365.     if (urlh!=(Handle)0){
  366.         DisposeHandle(urlh);
  367.     }
  368.     
  369.     return err;
  370. }
  371.  
  372. pascal ICError ICCIMapFilename(GlobalsHandle globals,StringPtr filename,ICMapEntry* entry){
  373.     ICError err;
  374.     Handle entries;
  375.     ICAttr junk_attr;
  376.     
  377.     err=(ICError)noErr;
  378.     
  379.     if (filename[0]==0)
  380.         return paramErr;
  381.     
  382.     err=ICCGetPrefHandle((*globals)->current_target,kICMapping,&junk_attr,&entries);
  383.     
  384.     if (err==noErr){
  385.         err=ICCMapEntriesFilename((*globals)->current_target,entries,filename,entry);
  386.         
  387.         DisposeHandle(entries);
  388.     }
  389.     
  390.     return err;
  391. }
  392.  
  393. pascal ICError ICCIMapTypeCreator(GlobalsHandle globals,OSType fType,OSType fCreator,StringPtr filename,
  394.         ICMapEntry* entry){
  395.     ICError err;
  396.     Handle entries;
  397.     ICAttr junk_attr;
  398.     
  399.     err=ICCGetPrefHandle((*globals)->current_target,kICMapping,&junk_attr,&entries);
  400.     
  401.     if (err==noErr){
  402.         err=ICCMapEntriesTypeCreator((*globals)->current_target,entries,fType,fCreator,filename,entry);
  403.         DisposeHandle(entries);
  404.     }
  405.     
  406.     return err;
  407. }
  408.  
  409. pascal ICError ICCIStop(GlobalsHandle globals){
  410.     return ICRStop(&((*globals)->inst));
  411. }
  412.  
  413. pascal ICError ICCIFindConfigFile(GlobalsHandle globals,short count,ICDirSpecArrayPtr folders){
  414.     return ICRFindConfigFile(&((*globals)->inst),count,folders);
  415. }
  416.  
  417. pascal ICError ICCIFindUserConfigFile(GlobalsHandle globals,ICDirSpec* where){
  418.     return ICRFindUserConfigFile(&((*globals)->inst),where);
  419. }
  420.  
  421. pascal ICError ICCIGeneralFindConfigFile(GlobalsHandle globals,Boolean search_prefs,Boolean can_create,short count,
  422.         ICDirSpecArrayPtr folders){
  423.     return ICRGeneralFindConfigFile(&((*globals)->inst),search_prefs,can_create,count,folders);
  424. }
  425.  
  426. pascal ICError ICCIChooseConfig(GlobalsHandle globals){
  427.     return ICRChooseConfig(&((*globals)->inst));
  428. }
  429.  
  430. pascal ICError ICCIChooseNewConfig(GlobalsHandle globals){
  431.     return ICRChooseNewConfig(&((*globals)->inst));
  432. }
  433.  
  434. pascal ICError ICCIGetGonfigName(GlobalsHandle globals,Boolean longname,StringPtr name){
  435.     return ICRGetConfigName(&((*globals)->inst),longname,name);
  436. }
  437.  
  438. pascal ICError ICCIGetConfigReference(GlobalsHandle globals,ICConfigRefHandle ref){
  439.     return ICRGetConfigReference(&((*globals)->inst),ref);
  440. }
  441.  
  442. pascal ICError ICCISetConfigReference(GlobalsHandle globals,ICConfigRefHandle ref,long flags){
  443.     return ICRSetConfigReference(&((*globals)->inst),ref,flags);
  444. }
  445.  
  446. pascal ICError ICCISpecifyConfigFile(GlobalsHandle globals,FSSpecPtr config){
  447.     return ICRSpecifyConfigFile(&((*globals)->inst),config);
  448. }
  449.  
  450. pascal ICError ICCIGetSeed(GlobalsHandle globals,long* seed){
  451.     return ICRGetSeed(&((*globals)->inst),seed);
  452. }
  453.  
  454. pascal ICError ICCIGetPerm(GlobalsHandle globals,ICPerm* perm){
  455.     return ICRGetPerm(&((*globals)->inst),perm);
  456. }
  457.  
  458. pascal ICError ICCIBegin(GlobalsHandle globals,ICPerm perm){
  459.     return ICRBegin(&((*globals)->inst),perm);
  460. }
  461.  
  462. pascal ICError ICCICountPref(GlobalsHandle globals,long* count){
  463.     return ICRCountPref(&((*globals)->inst),count);
  464. }
  465.  
  466. pascal ICError ICCIGetIndPref(GlobalsHandle globals,long n,StringPtr key){
  467.     return ICRGetIndPref(&((*globals)->inst),n,key);
  468. }
  469.  
  470. pascal ICError ICCIDeletePref(GlobalsHandle globals,StringPtr key){
  471.     return ICRDeletePref(&((*globals)->inst),key);
  472. }
  473.  
  474. pascal ICError ICCIEnd(GlobalsHandle globals){
  475.     return ICREnd(&((*globals)->inst));
  476. }
  477.  
  478. pascal ICError ICCIEditPreferences(GlobalsHandle globals,StringPtr key){
  479.     return ICREditPreferences(&((*globals)->inst),key);
  480. }
  481.  
  482. pascal ICError ICCIParseURL(GlobalsHandle globals,StringPtr hint,Ptr data,long len,long* selStart,long* selEnd,
  483.         Handle url){
  484.     return ICRParseURL(&((*globals)->inst),hint,data,len,selStart,selEnd,url);
  485. }
  486.  
  487. pascal ICError ICCIMapEntriesFilename(GlobalsHandle globals,Handle entries,StringPtr filename,ICMapEntry* entry){
  488.     return ICRMapEntriesFilename(&((*globals)->inst),entries,filename,entry);
  489. }
  490.  
  491. pascal ICError ICCIMapEntriesTypeCreator(GlobalsHandle globals,Handle entries,OSType fType,OSType fCreator,
  492.         StringPtr filename,ICMapEntry* entry){
  493.     return ICRMapEntriesTypeCreator(&((*globals)->inst),entries,fType,fCreator,filename,entry);
  494. }
  495.  
  496. pascal ICError ICCICountMapEntries(GlobalsHandle globals,Handle entries,long* count){
  497.     return ICRCountMapEntries(&((*globals)->inst),entries,count);
  498. }
  499.  
  500. pascal ICError ICCIGetIndMapEntry(GlobalsHandle globals,Handle entries,long ndx,long* pos,ICMapEntry* entry){
  501.     return ICRGetIndMapEntry(&((*globals)->inst),entries,ndx,pos,entry);
  502. }
  503.  
  504. pascal ICError ICCIGetMapEntry(GlobalsHandle globals,Handle entries,long pos,ICMapEntry* entry){
  505.     return ICRGetMapEntry(&((*globals)->inst),entries,pos,entry);
  506. }
  507.  
  508. pascal ICError ICCISetMapEntry(GlobalsHandle globals,Handle entries,long pos,ICMapEntry* entry){
  509.     return ICRSetMapEntry(&((*globals)->inst),entries,pos,entry);
  510. }
  511.  
  512. pascal ICError ICCIDeleteMapEntry(GlobalsHandle globals,Handle entries,long pos){
  513.     return ICRDeleteMapEntry(&((*globals)->inst),entries,pos);
  514. }
  515.  
  516. pascal ICError ICCIAddMapEntry(GlobalsHandle globals,Handle entries,ICMapEntry* entry){
  517.     return ICRAddMapEntry(&((*globals)->inst),entries,entry);
  518. }
  519.  
  520. // ----- Component Entry Point -----
  521.  
  522. /*
  523.     "Component entry point.  It's pretty neat IMHO." - IC Pascal Programmers
  524.     
  525.     They were correct, their component entry routine was pretty neat, but I couldn't 
  526.     duplicate it exactly.  The original routine used procptrs with jumps to the appropriate
  527.     routines.  I redid it to use universal proc ptrs with the conditional macros to expand the calls.
  528. */
  529. pascal ComponentResult 
  530. #ifdef DEBUG_IC_COMPONENT
  531. InternetConfig
  532. #else /* Not DEBUG_IC_COMPONENT */
  533. main
  534. #endif /* DEBUG_IC_COMPONENT */
  535. (ComponentParameters* params,Handle storage){
  536.     ComponentFunctionUPP proc;
  537.     SignedByte s;
  538.     ComponentResult cres;
  539.     
  540. #if USESROUTINEDESCRIPTORS
  541. #ifndef DEBUG_IC_COMPONENT
  542.     __rsrcinit();
  543. #else
  544.     DebugStr("\pIC Component");
  545.     
  546. #endif
  547. #endif
  548.     
  549.     proc=(ComponentFunctionUPP)0;
  550.     
  551.     switch (params->what){
  552.         // Component Manager Interface
  553.         
  554.         case kComponentVersionSelect:
  555.             cres=internetConfigurationComponentInterfaceVersion;
  556.             break;
  557.         case kComponentCanDoSelect:
  558.             proc=BuildNewProc(ICCICanDo,uppICCanDoProcInfo);
  559.             break;
  560.         case kComponentOpenSelect:
  561.             proc=BuildNewProc(ICCIOpen,uppICOpenProcInfo);
  562.             break;
  563.         case kComponentCloseSelect:
  564.             proc=BuildNewProc(ICCIClose,uppICCloseProcInfo);
  565.             break;
  566.         case kComponentTargetSelect:
  567.             proc=BuildNewProc(ICCITarget,uppICTargetProcInfo);
  568.             break;
  569.         
  570.         // Component Interface
  571.         
  572.         case kICCStart:
  573.             proc=BuildNewProc(ICCIStart,uppICStartProcInfo);
  574.             break;
  575.         case kICCStop:
  576.             proc=BuildNewProc(ICCIStop,uppICStopProcInfo);
  577.             break;
  578.         case kICCFindConfigFile:
  579.             proc=BuildNewProc(ICCIFindConfigFile,uppICFindConfigFileProcInfo);
  580.             break;
  581.         case kICCFindUserConfigFile:
  582.             proc=BuildNewProc(ICCIFindUserConfigFile,uppICFindUserConfigFileProcInfo);
  583.             break;
  584.         case kICCGeneralFindConfigFile:
  585.             proc=BuildNewProc(ICCIGeneralFindConfigFile,uppICGeneralFindConfigFileProcInfo);
  586.             break;
  587.         case kICCGetConfigName:
  588.             proc=BuildNewProc(ICCIGetGonfigName,uppICGetConfigNameProcInfo);
  589.             break;
  590.         case kICCGetConfigReference:
  591.             proc=BuildNewProc(ICCIGetConfigReference,uppICGetConfigReferenceProcInfo);
  592.             break;
  593.         case kICCChooseConfig:
  594.             proc=BuildNewProc(ICCIChooseConfig,uppICChooseConfigProcInfo);
  595.             break;
  596.         case kICCChooseNewConfig:
  597.             proc=BuildNewProc(ICCIChooseNewConfig,uppICChooseNewConfigProcInfo);
  598.             break;
  599.         case kICCSetConfigReference:
  600.             proc=BuildNewProc(ICCISetConfigReference,uppICSetConfigReferenceProcInfo);
  601.             break;
  602.         case kICCSpecifyConfigFile:
  603.             proc=BuildNewProc(ICCISpecifyConfigFile,uppICSpecifyConfigFileProcInfo);
  604.             break;
  605.         case kICCGetSeed:
  606.             proc=BuildNewProc(ICCIGetSeed,uppICGetSeedProcInfo);
  607.             break;
  608.         case kICCGetPerm:
  609.             proc=BuildNewProc(ICCIGetPerm,uppICGetPermProcInfo);
  610.             break;
  611.         case kICCDefaultFileName:
  612.             proc=BuildNewProc(ICCIDefaultFileName,uppICDefaultFileNameProcInfo);
  613.             break;
  614.         case kICCBegin:
  615.             proc=BuildNewProc(ICCIBegin,uppICBeginProcInfo);
  616.             break;
  617.         case kICCGetPref:
  618.             proc=BuildNewProc(ICCIGetPref,uppICGetPrefProcInfo);
  619.             break;
  620.         case kICCSetPref:
  621.             proc=BuildNewProc(ICCISetPref,uppICSetPrefProcInfo);
  622.             break;
  623.         case kICCFindPrefHandle:
  624.             proc=BuildNewProc(ICCIFindPrefHandle,uppICFindPrefHandleProcInfo);
  625.             break;
  626.         case kICCGetPrefHandle:
  627.             proc=BuildNewProc(ICCIGetPrefHandle,uppICGetPrefHandleProcInfo);
  628.             break;
  629.         case kICCSetPrefHandle:
  630.             proc=BuildNewProc(ICCISetPrefHandle,uppICSetPrefHandleProcInfo);
  631.             break;
  632.         case kICCCountPref:
  633.             proc=BuildNewProc(ICCICountPref,uppICCountPrefProcInfo);
  634.             break;
  635.         case kICCGetIndPref:
  636.             proc=BuildNewProc(ICCIGetIndPref,uppICGetIndPrefProcInfo);
  637.             break;
  638.         case kICCDeletePref:
  639.             proc=BuildNewProc(ICCIDeletePref,uppICDeletePrefProcInfo);
  640.             break;
  641.         case kICCEnd:
  642.             proc=BuildNewProc(ICCIEnd,uppICEndProcInfo);
  643.             break;
  644.         case kICCEditPreferences:
  645.             proc=BuildNewProc(ICCIEditPreferences,uppICEditPreferencesProcInfo);
  646.             break;
  647.         case kICCParseURL:
  648.             proc=BuildNewProc(ICCIParseURL,uppICParseURLProcInfo);
  649.             break;
  650.         case kICCLaunchURL:
  651.             proc=BuildNewProc(ICCILaunchURL,uppICLaunchURLProcInfo);
  652.             break;
  653.         case kICCMapFilename:
  654.             proc=BuildNewProc(ICCIMapFilename,uppICMapFilenameProcInfo);
  655.             break;
  656.         case kICCMapTypeCreator:
  657.             proc=BuildNewProc(ICCIMapTypeCreator,uppICMapTypeCreatorProcInfo);
  658.             break;
  659.         case kICCMapEntriesFilename:
  660.             proc=BuildNewProc(ICCIMapEntriesFilename,uppICMapEntriesFilenameProcInfo);
  661.             break;
  662.         case kICCMapEntriesTypeCreator:
  663.             proc=BuildNewProc(ICCIMapEntriesTypeCreator,uppICMapEntriesTypeCreatorProcInfo);
  664.             break;
  665.         case kICCCountMapEntries:
  666.             proc=BuildNewProc(ICCICountMapEntries,uppICCountMapEntriesProcInfo);
  667.             break;
  668.         case kICCGetIndMapEntry:
  669.             proc=BuildNewProc(ICCIGetIndMapEntry,uppICGetIndMapEntryProcInfo);
  670.             break;
  671.         case kICCGetMapEntry:
  672.             proc=BuildNewProc(ICCIGetMapEntry,uppICGetMapEntryProcInfo);
  673.             break;
  674.         case kICCSetMapEntry:
  675.             proc=BuildNewProc(ICCISetMapEntry,uppICSetMapEntryProcInfo);
  676.             break;
  677.         case kICCDeleteMapEntry:
  678.             proc=BuildNewProc(ICCIDeleteMapEntry,uppICDeleteMapEntryProcInfo);
  679.             break;
  680.         case kICCAddMapEntry:
  681.             proc=BuildNewProc(ICCIAddMapEntry,uppICAddMapEntryProcInfo);
  682.             break;
  683.             
  684.         default:
  685.             cres=(ComponentResult)badComponentSelector;
  686.             break;
  687.     }
  688.     
  689.     if (proc!=(ComponentFunctionUPP)0){
  690.         // have a proc, call it
  691.         
  692.         if (storage!=(Handle)0){
  693.             s=HGetState(storage);
  694.             HLock(storage);
  695.         }
  696.         
  697.         cres=CallComponentFunctionWithStorage(storage,params,proc);
  698.         
  699.         DisposeRoutineDescriptor((UniversalProcPtr)proc);
  700.         
  701.         if ((storage!=(Handle)0)&&(params->what!=kComponentCloseSelect)){
  702.             HSetState(storage,s);
  703.         }
  704.         
  705.     }
  706.     
  707. #if USESROUTINEDESCRIPTORS
  708. #ifndef DEBUG_IC_COMPONENT
  709.     __rsrcterm();
  710. #endif
  711. #endif
  712.  
  713.     return cres;
  714. }
  715.